home *** CD-ROM | disk | FTP | other *** search
/ ...taking it to the Macs! / ...taking it to the Macs!.iso / Extras / ActiveX Mac SDK / ActiveX SDK / Sample Controls / BDiamond / C3DView.cp < prev    next >
Encoding:
Text File  |  1996-12-20  |  13.3 KB  |  394 lines  |  [TEXT/CWIE]

  1. #include "ocheaders.h"
  2. #include "FnAssert.h"
  3. #include "C3DView.h"
  4.  
  5.  
  6. //------------------------------------------------------------------------------
  7. //    Static members
  8. //------------------------------------------------------------------------------
  9.  
  10. RGBColor C3DView::gColor [ kDefaultNumberOf3DViewStates ] [ kDefaultNumberOf3DViewParts ];
  11.  
  12. const Boolean kIsDeep             = true;
  13. const Boolean kIsNotDeep         = false;
  14.  
  15. const Boolean kIsDepressed         = true;
  16. const Boolean kIsNotDepressed     = false;
  17.  
  18. void SetRGBColor(const RGBColor * srcColor, RGBColor * destColor);
  19. void SetRGBColor(const RGBColor * srcColor, RGBColor * destColor)
  20. {
  21.     destColor->red   = srcColor->red;
  22.     destColor->green = srcColor->green;
  23.     destColor->blue  = srcColor->blue;
  24. }
  25.  
  26. //------------------------------------------------------------------------------
  27. //    Initialization
  28. //------------------------------------------------------------------------------
  29.  
  30. void InitU3DView(void)
  31. {
  32.     //    Set up static array for default color handling.
  33.     
  34.     C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].red                = 0xDDDD;
  35.     C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].green            = 0xDDDD;
  36.     C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].blue                = 0xDDDD;
  37.  
  38.     C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].red                = 0xBBBB;
  39.     C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].green                = 0xBBBB;
  40.     C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].blue                = 0xBBBB;
  41.  
  42.     C3DView::gColor [ rstNominal ] [ rptFill ].red                            = 0xAAAA;
  43.     C3DView::gColor [ rstNominal ] [ rptFill ].green                        = 0xAAAA;
  44.     C3DView::gColor [ rstNominal ] [ rptFill ].blue                            = 0xAAAA;
  45.  
  46.     C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].red                = 0x8888;
  47.     C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].green            = 0x8888;
  48.     C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].blue                = 0x8888;
  49.  
  50.     C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].red                = 0x5555;
  51.     C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].green            = 0x5555;
  52.     C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].blue                = 0x5555;
  53.  
  54.     C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].red                = 0x2222;
  55.     C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].green            = 0x2222;
  56.     C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].blue            = 0x2222;
  57.  
  58.  
  59.     C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].red                    = 0xFFFF;
  60.     C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].green                = 0xCCCC;
  61.     C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].blue                    = 0xCCCC;
  62.  
  63.     C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].red                    = 0xFFFF;
  64.     C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].green                    = 0x9999;
  65.     C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].blue                    = 0x9999;
  66.  
  67.     C3DView::gColor [ rstRed ] [ rptFill ].red                                = 0xFFFF;
  68.     C3DView::gColor [ rstRed ] [ rptFill ].green                            = 0x9999;
  69.     C3DView::gColor [ rstRed ] [ rptFill ].blue                                = 0x9999;
  70.  
  71.     C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].red                    = 0xFFFF;
  72.     C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].green                = 0x6666;
  73.     C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].blue                    = 0x6666;
  74.  
  75.     C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].red                    = 0xFFFF;
  76.     C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].green                = 0x3333;
  77.     C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].blue                    = 0x3333;
  78.  
  79.     C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].red                    = 0x6666;
  80.     C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].green                = 0x0000;
  81.     C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].blue                = 0x0000;
  82.  
  83.  
  84.     C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].red                = 0xCCCC;
  85.     C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].green                = 0xFFFF;
  86.     C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].blue                = 0xCCCC;
  87.  
  88.     C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].red                    = 0x9999;
  89.     C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].green                = 0xCCCC;
  90.     C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].blue                = 0x9999;
  91.  
  92.     C3DView::gColor [ rstGreen ] [ rptFill ].red                            = 0x9999;
  93.     C3DView::gColor [ rstGreen ] [ rptFill ].green                            = 0xCCCC;
  94.     C3DView::gColor [ rstGreen ] [ rptFill ].blue                            = 0x9999;
  95.  
  96.     C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].red                = 0x6666;
  97.     C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].green                = 0x9999;
  98.     C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].blue                = 0x6666;
  99.  
  100.     C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].red                = 0x3333;
  101.     C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].green                = 0x6666;
  102.     C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].blue                = 0x3333;
  103.  
  104.     C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].red                = 0x0000;
  105.     C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].green                = 0x3333;
  106.     C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].blue                = 0x0000;
  107.  
  108.  
  109.     C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].red            = 0x3333;
  110.     C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].green            = 0x3333;
  111.     C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].blue            = 0x3333;
  112.  
  113.     C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].red                = 0xDDDD;
  114.     C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].green            = 0xDDDD;
  115.     C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].blue            = 0xDDDD;
  116.  
  117.     C3DView::gColor [ rstDepressed ] [ rptFill ].red                        = 0xAAAA;
  118.     C3DView::gColor [ rstDepressed ] [ rptFill ].green                        = 0xAAAA;
  119.     C3DView::gColor [ rstDepressed ] [ rptFill ].blue                        = 0xAAAA;
  120.  
  121.     C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].red            = 0xAAAA;
  122.     C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].green            = 0xAAAA;
  123.     C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].blue            = 0xAAAA;
  124.  
  125.     C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].red            = 0x8888;
  126.     C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].green            = 0x8888;
  127.     C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].blue            = 0x8888;
  128.  
  129.     C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].red            = 0x5555;
  130.     C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].green            = 0x5555;
  131.     C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].blue            = 0x5555;
  132.  
  133.  
  134.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].red        = 0x5555;
  135.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].green        = 0x5555;
  136.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].blue        = 0x5555;
  137.  
  138.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].red        = 0xDDDD;
  139.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].green        = 0xDDDD;
  140.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].blue        = 0xDDDD;
  141.  
  142.     C3DView::gColor [ rstDepressedWhite ] [ rptFill ].red                    = 0xEEEE;
  143.     C3DView::gColor [ rstDepressedWhite ] [ rptFill ].green                    = 0xEEEE;
  144.     C3DView::gColor [ rstDepressedWhite ] [ rptFill ].blue                    = 0xEEEE;
  145.  
  146.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].red        = 0xEEEE;
  147.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].green        = 0xEEEE;
  148.     C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].blue        = 0xEEEE;
  149.  
  150.     C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].red        = 0x8888;
  151.     C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].green        = 0x8888;
  152.     C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].blue        = 0x8888;
  153.  
  154.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].red        = 0x5555;
  155.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].green    = 0x5555;
  156.     C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].blue        = 0x5555;
  157. }
  158.  
  159. //------------------------------------------------------------------------------
  160. //    C3DView methods
  161. //------------------------------------------------------------------------------
  162.  
  163. //------------------------------------------------------------------------------
  164.  
  165. C3DView::C3DView(E3DState itsInitialState)
  166. {
  167.     mState = itsInitialState;
  168.     mIsDepressed = kIsNotDepressed;
  169.     
  170.     InitU3DView();
  171. }
  172.  
  173. //------------------------------------------------------------------------------
  174.  
  175. void
  176. C3DView::Draw3D(const DrawContext * context)
  177. {
  178.     ASSERT((context != NULL), "NULL draw context!");
  179.     
  180.     PenState savePen;
  181.     ::GetPenState(&savePen);
  182.     ::PenNormal();
  183.     
  184.     if ( CheckScreenDepth(context) > 1 )
  185.         DrawWithDepth ( context );
  186.     else
  187.         DrawWithoutDepth ( context );
  188.  
  189.     SetPenState(&savePen);
  190. }
  191.  
  192. //------------------------------------------------------------------------------
  193.  
  194. void
  195. C3DView::DrawWithDepth(const DrawContext * context)
  196. {
  197.     ASSERT((context != NULL), "NULL draw context!");
  198.     
  199.     //    Currently this method assumes that the "border" that creates the 
  200.     //    illusion of the 3D relief is two or three pixels wide (depending
  201.     //    on how you count).
  202.  
  203.     Rect        innerRect;
  204.     RGBColor     partColor;
  205.     Rect         qdArea = context->Location; 
  206.  
  207.     //    Fill the rect
  208.     
  209.     GetFillColor(&partColor);
  210.     ::RGBBackColor(&partColor);
  211.     ::SetRect(&innerRect, qdArea.left + 2, qdArea.top + 2, qdArea.right - 3,qdArea.bottom - 3);
  212.     ::EraseRect(&innerRect);
  213.  
  214.     //    Draw outside upper-left lines
  215.     
  216.     GetOutsideUpperLeftColor(&partColor);
  217.     ::RGBForeColor(&partColor);
  218.     ::MoveTo(qdArea.left,qdArea.bottom - 1);
  219.     ::LineTo(qdArea.left,qdArea.top);
  220.     ::LineTo(qdArea.right - 1, qdArea.top);            
  221.  
  222.     //    Draw inside upper-left lines
  223.     
  224.     GetInsideUpperLeftColor(&partColor);
  225.     ::RGBForeColor(&partColor);
  226.     ::MoveTo(qdArea.left + 1,qdArea.bottom - 2);
  227.     ::LineTo(qdArea.left + 1,qdArea.top + 1);
  228.     ::LineTo(qdArea.right - 2,qdArea.top + 1);
  229.  
  230.     //    Draw inside lower-right lines
  231.     
  232.     GetInsideLowerRightColor(&partColor);
  233.     ::RGBForeColor(&partColor);
  234.     ::MoveTo(qdArea.left + 2, qdArea.bottom - 3);
  235.     ::LineTo(qdArea.right - 3,qdArea.bottom - 3);
  236.     ::LineTo(qdArea.right - 3,qdArea.top + 2);
  237.  
  238.     //    Draw middle lower-right lines
  239.     
  240.     GetMiddleLowerRightColor(&partColor);
  241.     ::RGBForeColor(&partColor);
  242.     ::MoveTo(qdArea.left + 2, qdArea.bottom - 2);
  243.     ::LineTo(qdArea.right - 2, qdArea.bottom - 2);
  244.     ::LineTo(qdArea.right - 2, qdArea.top + 2);
  245.  
  246.     //    Draw outer lower-right lines
  247.     
  248.     GetOutsideLowerRightColor(&partColor);
  249.     ::RGBForeColor(&partColor);
  250.     ::MoveTo(qdArea.left + 1,qdArea.bottom - 1);
  251.     ::LineTo(qdArea.right - 1,qdArea.bottom - 1);
  252.     ::LineTo(qdArea.right - 1,qdArea.top + 1);
  253. }
  254.  
  255. //------------------------------------------------------------------------------
  256.  
  257. void
  258. C3DView::DrawWithoutDepth(const DrawContext * context)
  259. {
  260.     ASSERT((context != NULL), "NULL draw context!");
  261.  
  262.     Rect qdArea = context->Location; 
  263.     
  264.     Rect innerRect;
  265.     SetRect(&innerRect, qdArea.left + 2, qdArea.top + 2, qdArea.right - 2, qdArea.bottom - 2);
  266.  
  267.     EraseRect(&qdArea);
  268.     
  269.     if ( GetState() != rstNominal )
  270.         ::InvertRect(&innerRect);
  271.  
  272.     ::FrameRect(&qdArea);
  273. }
  274.  
  275. //------------------------------------------------------------------------------
  276.  
  277. void
  278. C3DView::Invalidate(const DrawContext * context)
  279. {
  280.     ASSERT((context != NULL), "NULL draw context!");
  281.     
  282.     ::InvalRect(&(context->Location));
  283. }
  284.  
  285. //------------------------------------------------------------------------------
  286.  
  287. short
  288. C3DView::CheckScreenDepth(const DrawContext * context)
  289. {
  290.     ASSERT((context != NULL), "NULL draw context!");
  291.  
  292.     short screenDepth = 1;
  293.  
  294.     //    Get global rect of our window
  295.     
  296.     GrafPtr    savedPort;
  297.     ::GetPort(&savedPort);
  298.     ::SetPort(context->Port);
  299.     Rect globalRect = context->Port->portRect;
  300.     Point topLeft = { globalRect.top, globalRect.left };
  301.     Point bottomRight = { globalRect.bottom, globalRect.right };
  302.     ::LocalToGlobal(&topLeft);
  303.     ::LocalToGlobal(&bottomRight);
  304.     ::SetPort(savedPort);
  305.     
  306.     //    Find the deepest GDevice it intersects
  307.     
  308.     GDHandle myGDHandle = ::GetMaxDevice ( &globalRect );
  309.     if ( myGDHandle != NULL )
  310.         screenDepth = (**((**myGDHandle).gdPMap)).pixelSize;
  311.     
  312.     return screenDepth;
  313. }
  314.  
  315. //------------------------------------------------------------------------------
  316.  
  317. E3DState
  318. C3DView::GetState()
  319. {
  320.     return mState;
  321. }
  322.  
  323. //------------------------------------------------------------------------------
  324.  
  325. void 
  326. C3DView::SetState(const DrawContext * context, E3DState theState, Boolean redraw)
  327. {
  328.     if ( theState != mState )
  329.     {
  330.         mState = theState;
  331.         
  332.         mIsDepressed = (mState >= rstDepressed);
  333.         
  334.         if ( redraw )
  335.             Draw3D(context);
  336.     }
  337. }
  338.  
  339. //------------------------------------------------------------------------------
  340.  
  341. Boolean 
  342. C3DView::IsDepressed()
  343. {
  344.     return mIsDepressed;
  345. }
  346.  
  347. //------------------------------------------------------------------------------
  348.  
  349. void
  350. C3DView::GetOutsideUpperLeftColor(RGBColor * returnColor)
  351. {
  352.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptOutsideUpperLeft ]), returnColor);
  353. }
  354.  
  355. //------------------------------------------------------------------------------
  356.  
  357. void
  358. C3DView::GetInsideUpperLeftColor(RGBColor * returnColor)
  359. {
  360.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptInsideUpperLeft ]), returnColor);
  361. }
  362.  
  363. //------------------------------------------------------------------------------
  364.  
  365. void
  366. C3DView::GetFillColor(RGBColor * returnColor)
  367. {
  368.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptFill ]), returnColor);
  369. }
  370.  
  371. //------------------------------------------------------------------------------
  372.  
  373. void
  374. C3DView::GetInsideLowerRightColor(RGBColor * returnColor)
  375. {
  376.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptInsideLowerRight ]), returnColor);
  377. }
  378.  
  379. //------------------------------------------------------------------------------
  380.  
  381. void
  382. C3DView::GetMiddleLowerRightColor(RGBColor * returnColor)
  383. {
  384.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptMiddleLowerRight ]), returnColor);
  385. }
  386.  
  387. //------------------------------------------------------------------------------
  388.  
  389. void
  390. C3DView::GetOutsideLowerRightColor(RGBColor * returnColor)
  391. {
  392.     ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptOutsideLowerRight ]), returnColor);
  393. }
  394.